package com.bbva.gptf.back.dominio;

import java.math.BigDecimal;
import java.sql.Types;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;

import oracle.jdbc.driver.OracleTypes;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.bbva.gptf.dto.bean.InstrumentoSimulacionMapper;
import com.bbva.gptf.dto.bean.InstrumentosSimulacion;
import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;

@Component
@Configurable
public class SpPosicion {
	

	private final I18nLog log = I18nLogFactory.getLogI18n(SpPosicion.class);
    
	private SimpleJdbcCall simpleJdbcCall;
    private DataSource dataSource;

    @Autowired
    public void setDataSource(DataSource dataSource) {
          this.dataSource = dataSource;
    }

    @PersistenceContext
    transient EntityManager entityManager;
	
    @SuppressWarnings("unchecked")
	@Transactional
    public List<InstrumentosSimulacion> execute(String objetos, String tipoMercado,
    		String tipoBusqueda, BigDecimal valor, Long tipoConsulta, String cdBancomer){
    	String procedureName = "PKG_GPT.SP_POSICION";
        this.simpleJdbcCall = new SimpleJdbcCall(this.dataSource);
        this.simpleJdbcCall.withoutProcedureColumnMetaDataAccess();
        this.simpleJdbcCall.withProcedureName(procedureName);
        this.simpleJdbcCall.declareParameters(new SqlParameter("p_instrumen", Types.CLOB));
        this.simpleJdbcCall.declareParameters(new SqlParameter("p_tipo_mercado", Types.VARCHAR));
        this.simpleJdbcCall.declareParameters(new SqlParameter("p_tipo_busqueda", Types.VARCHAR));
        this.simpleJdbcCall.declareParameters(new SqlParameter("p_valor", Types.NUMERIC));
        this.simpleJdbcCall.declareParameters(new SqlParameter("p_tipo_consulta", Types.NUMERIC));
        this.simpleJdbcCall.declareParameters(new SqlParameter("p_cd_bancomer", Types.VARCHAR));
        this.simpleJdbcCall.declareParameters(new SqlOutParameter("c_posicion", OracleTypes.CURSOR, new InstrumentoSimulacionMapper()));
        
        Map<String, Object> parametros = new HashMap<String, Object>();
        log.info("Metodo PKG_GPT.SP_POSICION");
        log.info("Parametros: " + objetos);
        log.info("Parametros: " + tipoMercado);
        log.info("Parametros: " + tipoBusqueda);
        log.info("Parametros: " + valor);
        log.info("Parametros: " + tipoConsulta);
        log.info("Parametros: " + cdBancomer);
        parametros.put("p_instrumen", objetos);
        parametros.put("p_tipo_mercado", tipoMercado);
        parametros.put("p_tipo_busqueda", tipoBusqueda);
        parametros.put("p_valor", valor);
        parametros.put("p_tipo_consulta", tipoConsulta);
        parametros.put("p_cd_bancomer", cdBancomer);
        Map<String, Object> out = this.simpleJdbcCall.execute(parametros);
        return (List<InstrumentosSimulacion>) out.get("c_posicion");
	}
}
